#include "Personaje.h"

using namespace MOC;
Personaje::Personaje(void)
{
}

Personaje::~Personaje(void)
{
}
void Personaje::Init(SceneManager* sceneManager, CollisionTools* colision, TerrainDecal* terreno, String nombre, String modelo)
{
        Inicializar (sceneManager, nombre, modelo, terreno);
        m_collisionTools = colision;
        mVelocidad  = 0.5;
}


void Personaje::UpdateLogic()
{
              
        if(getPosition().y > mTerreno->getHeightAt(getPosition()))
        {
                setPosition(
                        getPosition().x,
                        getPosition().y - 200,
                        getPosition().z
                );
        }
        
}


AnimationState* Personaje::getAnimationState(String state) 
{
	return mEntidad ->getAnimationState(state);
}

bool Personaje::Move(int mov)
{
        bool colision = false;

        switch(mov)
        {
				case IZQUIERDA:
                        Girar(1);
                        break;
                case ADELANTE:
						colision = Caminar(0, 0,getVelocidad());
                        break;
                case DERECHA:
                        Girar(-1);
                        break;				
                case ATRAS:
                        colision = Caminar(0, 0, -getVelocidad());
                        break;
        }

        return colision;
}

bool Personaje::Caminar(Real tx, Real ty, Real tz)
{
        bool collision;
        Vector3 position = Vector3(getPosition().x, 0.0, getPosition().z);
        Vector3 translation = Vector3(tx, ty, tz);
        Vector3 nextPos = position + getOrientation() * translation * 1; // change 1 to accelerate

        // En principi, no cal...
		m_collisionTools->calculateY(mScnNodo,true,true,2.0f,0xFFFFFFFF);

        // Check that not collides AND is walkable
        collision = m_collisionTools->collidesWithEntity(getPosition(), nextPos, 3.0f, 0.0f, 0xFFFFFFFF);
        if(!collision && mTerreno->isWalkable(nextPos.x, nextPos.z))
        {
                setPosition(nextPos);
        }

        return collision;
}

void Personaje::Girar(int direction)
{
        Quaternion newOrientation = getOrientation() * Quaternion(Degree(direction * 1), Vector3::UNIT_Y);
        setOrientation(newOrientation);
}

